home *** CD-ROM | disk | FTP | other *** search
- # Module 'shutil' -- utility functions usable in a shell-like program
-
- import os
-
- MODEBITS = 010000 # Lower 12 mode bits
- # Change this to 01000 (9 mode bits) to avoid copying setuid etc.
-
- # Copy data from src to dst
- #
- def copyfile(src, dst):
- fsrc = open(src, 'r')
- fdst = open(dst, 'w')
- while 1:
- buf = fsrc.read(16*1024)
- if not buf: break
- fdst.write(buf)
-
- # Copy mode bits from src to dst
- #
- def copymode(src, dst):
- st = os.stat(src)
- mode = divmod(st[0], MODEBITS)[1]
- os.chmod(dst, mode)
-
- # Copy all stat info (mode bits, atime and mtime) from src to dst
- #
- def copystat(src, dst):
- st = os.stat(src)
- mode = divmod(st[0], MODEBITS)[1]
- os.chmod(dst, mode)
- os.utime(dst, st[7:9])
-
- # Copy data and mode bits ("cp src dst")
- #
- def copy(src, dst):
- copyfile(src, dst)
- copymode(src, dst)
-
- # Copy data and all stat info ("cp -p src dst")
- #
- def copy2(src, dst):
- copyfile(src, dst)
- copystat(src, dst)
-
- # Recursively copy a directory tree.
- # The destination must not already exist.
- #
- def copytree(src, dst):
- names = os.listdir(src)
- os.mkdir(dst, 0777)
- dot_dotdot = (os.curdir, os.pardir)
- for name in names:
- if name not in dot_dotdot:
- srcname = os.path.join(src, name)
- dstname = os.path.join(dst, name)
- #print 'Copying', srcname, 'to', dstname
- try:
- #if os.path.islink(srcname):
- # linkto = os.readlink(srcname)
- # os.symlink(linkto, dstname)
- #elif os.path.isdir(srcname):
- if os.path.isdir(srcname):
- copytree(srcname, dstname)
- else:
- copy2(srcname, dstname)
- # XXX What about devices, sockets etc.?
- except os.error, why:
- print 'Could not copy', srcname, 'to', dstname,
- print '(', why[1], ')'
-